1   /**
2    * Copyright 2014 Netflix, Inc.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    * http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package rx.internal.operators;
17  
18  import static org.mockito.Matchers.isA;
19  import static org.mockito.Mockito.inOrder;
20  import static org.mockito.Mockito.mock;
21  import static org.mockito.Mockito.times;
22  
23  import org.junit.Test;
24  import org.mockito.InOrder;
25  
26  import rx.Observable;
27  import rx.Observer;
28  import rx.exceptions.TestException;
29  import rx.functions.Func2;
30  
31  public class OperatorSequenceEqualTest {
32  
33      @Test
34      public void test1() {
35          Observable<Boolean> observable = Observable.sequenceEqual(
36                  Observable.just("one", "two", "three"),
37                  Observable.just("one", "two", "three"));
38          verifyResult(observable, true);
39      }
40  
41      @Test
42      public void test2() {
43          Observable<Boolean> observable = Observable.sequenceEqual(
44                  Observable.just("one", "two", "three"),
45                  Observable.just("one", "two", "three", "four"));
46          verifyResult(observable, false);
47      }
48  
49      @Test
50      public void test3() {
51          Observable<Boolean> observable = Observable.sequenceEqual(
52                  Observable.just("one", "two", "three", "four"),
53                  Observable.just("one", "two", "three"));
54          verifyResult(observable, false);
55      }
56  
57      @Test
58      public void testWithError1() {
59          Observable<Boolean> observable = Observable.sequenceEqual(
60                  Observable.concat(Observable.just("one"),
61                          Observable.<String> error(new TestException())),
62                  Observable.just("one", "two", "three"));
63          verifyError(observable);
64      }
65  
66      @Test
67      public void testWithError2() {
68          Observable<Boolean> observable = Observable.sequenceEqual(
69                  Observable.just("one", "two", "three"),
70                  Observable.concat(Observable.just("one"),
71                          Observable.<String> error(new TestException())));
72          verifyError(observable);
73      }
74  
75      @Test
76      public void testWithError3() {
77          Observable<Boolean> observable = Observable.sequenceEqual(
78                  Observable.concat(Observable.just("one"),
79                          Observable.<String> error(new TestException())),
80                  Observable.concat(Observable.just("one"),
81                          Observable.<String> error(new TestException())));
82          verifyError(observable);
83      }
84  
85      @Test
86      public void testWithEmpty1() {
87          Observable<Boolean> observable = Observable.sequenceEqual(
88                  Observable.<String> empty(),
89                  Observable.just("one", "two", "three"));
90          verifyResult(observable, false);
91      }
92  
93      @Test
94      public void testWithEmpty2() {
95          Observable<Boolean> observable = Observable.sequenceEqual(
96                  Observable.just("one", "two", "three"),
97                  Observable.<String> empty());
98          verifyResult(observable, false);
99      }
100 
101     @Test
102     public void testWithEmpty3() {
103         Observable<Boolean> observable = Observable.sequenceEqual(
104                 Observable.<String> empty(), Observable.<String> empty());
105         verifyResult(observable, true);
106     }
107 
108     @Test
109     public void testWithNull1() {
110         Observable<Boolean> observable = Observable.sequenceEqual(
111                 Observable.just((String) null), Observable.just("one"));
112         verifyResult(observable, false);
113     }
114 
115     @Test
116     public void testWithNull2() {
117         Observable<Boolean> observable = Observable.sequenceEqual(
118                 Observable.just((String) null), Observable.just((String) null));
119         verifyResult(observable, true);
120     }
121 
122     @Test
123     public void testWithEqualityError() {
124         Observable<Boolean> observable = Observable.sequenceEqual(
125                 Observable.just("one"), Observable.just("one"),
126                 new Func2<String, String, Boolean>() {
127                     @Override
128                     public Boolean call(String t1, String t2) {
129                         throw new TestException();
130                     }
131                 });
132         verifyError(observable);
133     }
134 
135     private void verifyResult(Observable<Boolean> observable, boolean result) {
136         @SuppressWarnings("unchecked")
137         Observer<Boolean> observer = mock(Observer.class);
138         observable.subscribe(observer);
139 
140         InOrder inOrder = inOrder(observer);
141         inOrder.verify(observer, times(1)).onNext(result);
142         inOrder.verify(observer).onCompleted();
143         inOrder.verifyNoMoreInteractions();
144     }
145 
146     private void verifyError(Observable<Boolean> observable) {
147         @SuppressWarnings("unchecked")
148         Observer<Boolean> observer = mock(Observer.class);
149         observable.subscribe(observer);
150 
151         InOrder inOrder = inOrder(observer);
152         inOrder.verify(observer, times(1)).onError(isA(TestException.class));
153         inOrder.verifyNoMoreInteractions();
154     }
155 }